/*
用来打印进程地址空间中不同区域的地址，
并观察线程控制块（TCB）是存放在栈上还是共享区上。
*/
#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <malloc.h>  // 新增头文件用于malloc_usable_size

// 新增地址打印函数
void print_address(const char* name, const void* addr) {
    std::cout << name << " address: \t0x" << std::hex << (uintptr_t)addr << std::dec << std::endl;
}

// 全局变量（数据段）
int global_var;
static int static_global_var;

void *TestThreadFun(void *arg) {
    // 新增线程栈变量
    int thread_stack_var;
    print_address("Thread stack        ", &thread_stack_var);
    
    // 打印线程自身ID的地址（TCB指针）
    pthread_t self = pthread_self();
    print_address("pthread_self()      ", (void*)self);

    // ... 原有的线程逻辑保持不变 ...
    return nullptr;
}

int main()
{
    // 打印代码段地址
    print_address("Main function       ", (void*)main);
    
    // 数据段地址
    print_address("Global variable     ", &global_var);
    print_address("Static global var   ", &static_global_var);
    
    // 堆地址
    int* heap_var = new int;
    print_address("Heap allocation     ", heap_var);
    
    // 主线程栈地址
    int main_stack_var;
    print_address("Main thread stack   ", &main_stack_var);
    
    // 共享库函数地址
    print_address("printf function     ", (void*)printf);
    
    // 原有的线程创建逻辑保持不变 ...
    pthread_t tid;
    pthread_create(&tid, nullptr, TestThreadFun, nullptr);
    pthread_join(tid, nullptr);
    delete heap_var;
    return 0;
}
